package cn.lkk.samples.lang.reflection;

import java.lang.reflect.Method;

/**
 * 演示使用 Method 对象反射调用方法
 */
public class MethodTableTest {

    public static void main(String[] args) throws NoSuchMethodException {
        Method square = MethodTableTest.class.getDeclaredMethod("square", double.class);
        Method sqrt = Math.class.getDeclaredMethod("sqrt", double.class);

        printTable(1,10,10,square);
        printTable(1,10,10,sqrt);
    }

    /**
     * 返回一个数的平方值
     *
     * @param x 一个数
     * @return x的平方
     */
    public static double square(double x) {
        return x * x;
    }

    /**
     * 打印从 from 到 to 的之间n个数的计算值，计算函数为 f
     *
     * @param from 起点
     * @param to   终点
     * @param n    数量
     * @param f    计算函数
     */
    public static void printTable(double from, double to, int n, Method f) {
        System.out.println(f);

        //步长
        double dx = (to - from) / (n - 1);
        for (double x = from; x <= to; x += dx) {
            try {
                double y = (Double) f.invoke(null, x);
                System.out.printf("%10.4f | %10.4f%n", x, y);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
